package com.haochang.base;

import com.haochang.chunkvod.tools.vod.event.EventObservable;
import com.haochang.chunkvod.tools.vod.event.EventObserver;

/**
 * 使用事件代理，规避被监听对象要一直存在于内存当中<br>
 * 注册监听和取消注册监听，请保证成对出现。
 * 
 * @author Jie,Xingbo
 * @date 2015-8-12
 */
public class EventProxy extends EventObservable
{
	private static EventProxy instance;

	private EventProxy()
	{
	}

	/**
	 * 由{@link BaseApplication} 负责初始化
	 */
	protected static void init()
	{
		instance = new EventProxy();
	}

	@Override
	public int getEventFamily()
	{
		return 0;
	}

	/**
	 * 添加一个监听对象，监听指定事件
	 * @param eventIds
	 * @param listener
	 */
	public static void addEventListener(EventObserver listener, int... eventIds)
	{
		if (instance != null && eventIds != null && eventIds.length > 0)
		{
			for (int id : eventIds)
			{
				instance.addListener(id, listener);
			}
		}
	}

	/**
	 * 移除指定监听对象对指定事件的监听
	 * @param eventId
	 * @param listener
	 */
	public static void removeEventListener(int eventId, EventObserver listener)
	{
		if (instance != null)
		{
			instance.removeListener(eventId, listener);
		}
	}

	/**
	 * 移除指定监听对象所监听的所有事件
	 * @param listener
	 */
	public static void removeEventListener(EventObserver listener)
	{
		if (instance != null)
		{
			instance.removeListener(listener);
		}
	}

	/**
	 * 通知事件的发生
	 * @param eventId {@link IEventConstant}
	 * @param args
	 */
	public static void notifyEvent(int eventId, Object... args)
	{
		if (instance != null)
		{
			instance.notify(eventId, args);
		}
	}
}
